package com.example.junit5demo;

import com.example.junit5demo.controller.HelloController;
import com.example.junit5demo.service.HelloService;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
import org.mockito.Mockito;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest;
import org.springframework.boot.test.mock.mockito.MockBean;
import org.springframework.test.web.servlet.MockMvc;
import org.springframework.test.web.servlet.request.MockMvcRequestBuilders;
import org.springframework.test.web.servlet.result.MockMvcResultHandlers;
import org.springframework.test.web.servlet.result.MockMvcResultMatchers;

@WebMvcTest(HelloController.class)
public class MockitoTest_v2 {


    @Autowired
    MockMvc mockMvc;

    @MockBean
    HelloService helloService;



    @Test
    @DisplayName("mock Controller")
    public void testHello() throws Exception {
        /*
        说明：

        @WebMvcTest 注释告诉 Spring Boot 仅实例化 Controller 层，而不去实例化整体上下文，还可以进一步指定仅实例化 Controller 层的某个
        实例：@WebMvcTest(HelloController.class)；
        因为只实例化了 Controller 层，所以依赖的 Service 层实例需要通过 @MockBean 创建，并通过 Mockito 的方法指定 Mock 出来的 Service
        层实例在特定情况下方法调用时的返回结果。

        作者：又语
        链接：https://www.jianshu.com/p/4648fd55830e
        来源：简书
        著作权归作者所有。商业转载请联系作者获得授权，非商业转载请注明出处。
         */

        //Mockito.when(helloController.hello(Mockito.anyString())).thenReturn("Mock haha");
        Mockito.when(helloService.hello(Mockito.anyString())).thenReturn("Mock haha1");

        this.mockMvc.perform(MockMvcRequestBuilders.get("/hello/spring"))
                .andDo(MockMvcResultHandlers.print())
                .andExpect(MockMvcResultMatchers.status().isOk())
                .andExpect(MockMvcResultMatchers.content().string("Mock haha1"));
    }
}
